//package com.kamistoat.ruoyicommondatascope.aspect;
//
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.kamistoat.ruoyiapisystem.domain.SysRole;
//import com.kamistoat.ruoyiapisystem.domain.SysUser;
//import com.kamistoat.ruoyiapisystem.entity.SysDeptEntity;
//import com.kamistoat.ruoyiapisystem.entity.SysRoleDeptEntity;
//import com.kamistoat.ruoyiapisystem.entity.SysRoleEntity;
//import com.kamistoat.ruoyiapisystem.model.LoginUser;
//import com.kamistoat.ruoyicommoncore.utils.StringUtils;
//import com.kamistoat.ruoyicommondatascope.annotation.DataScope;
//import com.kamistoat.ruoyicommonsecurity.utils.SecurityUtils;
//import org.apache.poi.ss.formula.functions.T;
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Before;
//import org.springframework.stereotype.Component;
//
//import java.lang.reflect.Array;
//import java.lang.reflect.Type;
//import java.util.ArrayList;
//
///**
// * 使用切面处理 @DataScope注解，在整体上解决数据权限过滤。
// * 注意。由于原项目不是用的mybatis-plus，所以这个切面只是再用String去拼接，那么独立出来做也是毫无问题的。但是现在想要用 Mybatis-plus，考虑将这个切面进行移植。
// */
//@Aspect
//@Component
//public class DataScopeAspect {
//    /**
//     * 全部数据权限
//     */
//    public static final String DATA_SCOPE_ALL = "1";
//
//    /**
//     * 自定数据权限
//     */
//    public static final String DATA_SCOPE_CUSTOM = "2";
//
//    /**
//     * 本人所在部门数据权限
//     */
//    public static final String DATA_SCOPE_DEPT = "3";
//
//    /**
//     * 本人所在部门及以下数据权限
//     */
//    public static final String DATA_SCOPE_DEPT_AND_CHILD = "4";
//
//    /**
//     * 仅本人数据权限
//     */
//    public static final String DATA_SCOPE_SELF = "5";
//
//    /**
//     * 数据权限过滤关键字
//     */
//    public static final String DATA_SCOPE = "dataScope";
//
//    /**
//     * 在切点拦截的方法前处理。
//     *
//     * @param joinPoint           切点
//     * @param dataScopeAnnotation 注解
//     * @throws Exception
//     */
//    @Before("@annotation(dataScopeAnnotation)")
//    public void doBefore(JoinPoint joinPoint, DataScope dataScopeAnnotation) throws Exception {
//        // 从ThreadLocal中获取当前登录用户
//        LoginUser currentLoginUser = SecurityUtils.getLoginUser();
//        if (StringUtils.isNotNull(currentLoginUser)) {
//
//            currentLoginUser.getUserParams().remove("deptIds");
//            currentLoginUser.getUserParams().remove("userIds");
//
//            SysUser currentSysUser = currentLoginUser.getSysUser();
//            // 如果当前用户不是超级管理员，则设置数据权限过滤
//            if (StringUtils.isNotNull(currentSysUser) && !currentSysUser.isAdmin()) {
//                // 一个登录对象可能有多个角色身份，这些身份各自的数据权限过滤应该以OR相连
//                ArrayList<Long> deptIds = new ArrayList<>();
//                ArrayList<Long> userIds = new ArrayList<>();
//                for (SysRole role : currentSysUser.getRoles()) {
//                    String dataScope = role.getDataScope();
//                    // 拥有全部权限，直接放行
//                    if(dataScope.equals(DATA_SCOPE_ALL)){
//                        return;
//                    }
//                    // 自定义权限，则需要在 sys_role_dept 表中进行查询
//                    if(dataScope.equals(DATA_SCOPE_CUSTOM)){
//                        new QueryWrapper<SysRoleDeptEntity>().select("dept_id").eq("role_id", role.getRoleId());
//                    }
//                }
//            }
//        }
//    }
//}
